package io.kimmking.java8;

import java.util.Arrays;
import java.util.List;

public class ForeachDemo {
    
    private int x=1;
    
    public static void main(String[] args) {
    
        ForeachDemo demo = new ForeachDemo();
        
        demo.test();
    
        System.out.println(demo.x);
    }
    
    private void test() {
        List list = Arrays.asList(1,2);
        int y = 1;
        System.out.println("testMethod:" + this.getClass());
        System.out.println("testThread:" + Thread.currentThread().getName());
        list.forEach(e -> {
            System.out.println("forEach:" + this.getClass());
            System.out.println("forEachThread" + Thread.currentThread().getName());
            x=2;
//            y=2;  // can't be compiled
            /**
             * 为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢？ 因为实例变量存在堆中，而局部变量是在栈上分配，Lambda 表达(匿名类) 会在另一个线程中执行。
             * 如果在线程中要直接访问一个局部变量，可能线程执行时该局部变量已经被销毁了，而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。
             */
        });
    }
    
}
